home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import sys
- import os
- import os.path as os
- import struct
- import time
- import threading
- from base.g import *
- from base.codes import *
- from base import device, utils, pml, codes
- from prnt import cups
- from fax import *
- PAGE_FLAG_NONE = 0
- PAGE_FLAG_NEW_PAGE = 1
- PAGE_FLAG_END_PAGE = 2
- PAGE_FLAG_NEW_DOC = 4
- PAGE_FLAG_END_DOC = 8
- PAGE_FLAG_END_STREAM = 16
- MAJOR_VER = 2
- MINOR_VER = 0
- MFPDTF_RASTER_BITMAP = 0
- MFPDTF_RASTER_GRAYMAP = 1
- MFPDTF_RASTER_MH = 2
- MFPDTF_RASTER_MR = 3
- MFPDTF_RASTER_MMR = 4
- MFPDTF_RASTER_RGB = 5
- MFPDTF_RASTER_YCC411 = 6
- MFPDTF_RASTER_JPEG = 7
- MFPDTF_RASTER_PCL = 8
- MFPDTF_RASTER_NOT = 9
- DT_UNKNOWN = 0
- DT_FAX_IMAGES = 1
- DT_SCANNED_IMAGES = 2
- DT_DIAL_STRINGS = 3
- DT_DEMO_PAGES = 4
- DT_SPEED_DIALS = 5
- DT_FAX_LOGS = 6
- DT_CFG_PARMS = 7
- DT_LANG_STRS = 8
- DT_JUNK_FAX_CSIDS = 9
- DT_REPORT_STRS = 10
- DT_FONTS = 11
- DT_TTI_BITMAP = 12
- DT_COUNTERS = 13
- DT_DEF_PARMS = 14
- DT_SCAN_OPTIONS = 15
- DT_FW_JOB_TABLE = 17
- RT_START_PAGE = 0
- RT_RASTER = 1
- RT_END_PAGE = 2
- FIXED_HEADER_SIZE = 8
- IMAGE_VARIANT_HEADER_SIZE = 10
- DIAL_STRINGS_VARIANT_HEADER_SIZE = 6
- FAX_IMAGE_VARIANT_HEADER_SIZE = 74
- SOP_RECORD_SIZE = 36
- RASTER_RECORD_SIZE = 4
- EOP_RECORD_SIZE = 12
- DIAL_STRING_RECORD_SIZE = 51
- PAGE_FLAG_NEW_PAGE = 1
- PAGE_FLAG_END_PAGE = 2
- PAGE_FLAG_NEW_DOC = 4
- PAGE_FLAG_END_DOC = 8
- PAGE_FLAG_END_STREAM = 16
- SRC_UNKNOWN = 0
- SRC_HOST = 2
- SRC_SCANNER = 5
- SRC_HOST_THEN_SCANNER = 6
- SRC_SCANNER_THEN_HOST = 7
- TTI_NONE = 0
- TTI_PREPENDED_TO_IMAGE = 1
- TTI_OVERLAYED_ON_IMAGE = 2
- RASTER_DATA_SIZE = 504
-
- class PMLFaxDevice(FaxDevice):
-
- def __init__(self, device_uri = None, printer_name = None, callback = None, fax_type = FAX_TYPE_NONE, disable_dbus = False):
- FaxDevice.__init__(self, device_uri, printer_name, callback, fax_type, disable_dbus)
- self.send_fax_thread = None
- self.upload_log_thread = None
-
-
- def setPhoneNum(self, num):
- return self.setPML(pml.OID_FAX_LOCAL_PHONE_NUM, str(num))
-
-
- def getPhoneNum(self):
- return utils.printable(str(self.getPML(pml.OID_FAX_LOCAL_PHONE_NUM)[1]))
-
- phone_num = property(getPhoneNum, setPhoneNum, doc = 'OID_FAX_LOCAL_PHONE_NUM')
-
- def setStationName(self, name):
- return self.setPML(pml.OID_FAX_STATION_NAME, str(name))
-
-
- def getStationName(self):
- return utils.printable(str(self.getPML(pml.OID_FAX_STATION_NAME)[1]))
-
- station_name = property(getStationName, setStationName, doc = 'OID_FAX_STATION_NAME')
-
- def setDateAndTime(self):
- t = time.localtime()
- p = struct.pack('BBBBBBB', t[0] - 2000, t[1], t[2], t[6] + 1, t[3], t[4], t[5])
- log.debug(repr(p))
- return self.setPML(pml.OID_DATE_AND_TIME, p)
-
-
- def uploadLog(self):
- if not self.isUloadLogActive():
- self.upload_log_thread = UploadLogThread(self)
- self.upload_log_thread.start()
- return True
- return False
-
-
- def isUploadLogActive(self):
- if self.upload_log_thread is not None:
- return self.upload_log_thread.isAlive()
- return False
-
-
- def waitForUploadLogThread(self):
- if self.upload_log_thread is not None and self.upload_log_thread.isAlive():
- self.upload_log_thread.join()
-
-
-
- def sendFaxes(self, phone_num_list, fax_file_list, cover_message = '', cover_re = '', cover_func = None, preserve_formatting = False, printer_name = '', update_queue = None, event_queue = None):
- if not self.isSendFaxActive():
- self.send_fax_thread = PMLFaxSendThread(self, self.service, phone_num_list, fax_file_list, cover_message, cover_re, cover_func, preserve_formatting, printer_name, update_queue, event_queue)
- self.send_fax_thread.start()
- return True
- return False
-
-
-
- class PMLUploadLogThread(threading.Thread):
-
- def __init__(self, dev):
- threading.Thread.__init__(self)
- self.dev = dev
-
-
- def run(self):
- STATE_DONE = 0
- STATE_ABORT = 10
- STATE_SUCCESS = 20
- STATE_BUSY = 25
- STATE_DEVICE_OPEN = 28
- STATE_CHECK_IDLE = 30
- STATE_REQUEST_START = 40
- STATE_WAIT_FOR_ACTIVE = 50
- STATE_UPLOAD_DATA = 60
- STATE_DEVICE_CLOSE = 70
- state = STATE_CHECK_IDLE
- while state != STATE_DONE:
- if state == STATE_ABORT:
- continue
- if state == STATE_SUCCESS:
- continue
- if state == STATE_BUSY:
- continue
- if state == STATE_DEVICE_OPEN:
- state = STATE_REQUEST_START
-
- try:
- self.dev.open()
- except Error:
- e = None
- log.error('Unable to open device (%s).' % e.msg)
- state = STATE_ERROR
-
-
- try:
- dev.setPML(pml.OID_UPLOAD_TIMEOUT, pml.DEFAULT_UPLOAD_TIMEOUT)
- except Error:
- state = STATE_ERROR
- except:
- None<EXCEPTION MATCH>Error
-
-
- None<EXCEPTION MATCH>Error
- if state == STATE_CHECK_IDLE:
- state = STATE_REQUEST_START
- ul_state = self.getCfgUploadState()
- if ul_state != pml.UPDN_STATE_IDLE:
- state = STATE_BUSY
-
- ul_state != pml.UPDN_STATE_IDLE
- if state == STATE_REQUEST_START:
- state = STATE_WAIT_FOR_ACTIVE
- self.dev.setPML(pml.OID_FAX_CFG_UPLOAD_DATA_TYPE, pml.FAX_CFG_UPLOAD_DATA_TYPE_FAXLOGS)
- self.dev.setPML(pml.OID_DEVICE_CFG_UPLOAD, pml.UPDN_STATE_REQSTART)
- continue
- if state == STATE_WAIT_FOR_ACTIVE:
- state = STATE_UPLOAD_DATA
- tries = 0
- while True:
- tries += 1
- ul_state = self.getCfgUploadState()
- if ul_state == pml.UPDN_STATE_XFERACTIVE:
- break
-
- if ul_state in (pml.UPDN_STATE_ERRORABORT, pml.UPDN_STATE_XFERDONE):
- log.error('Cfg upload aborted!')
- state = STATE_ERROR
- break
-
- if tries > 10:
- state = STATE_ERROR
- log.error('Unable to get into active state!')
- break
-
- time.sleep(0.5)
- continue
- if state == STATE_UPLOAD_DATA:
- continue
- if state == STATE_DEVICE_CLOSE:
- self.dev.close()
- continue
-
-
-
- class PMLFaxSendThread(FaxSendThread):
-
- def __init__(self, dev, service, phone_num_list, fax_file_list, cover_message = '', cover_re = '', cover_func = None, preserve_formatting = False, printer_name = '', update_queue = None, event_queue = None):
- FaxSendThread.__init__(self, dev, service, phone_num_list, fax_file_list, cover_message, cover_re, cover_func, preserve_formatting, printer_name, update_queue, event_queue)
-
-
- def run(self):
- STATE_DONE = 0
- STATE_ABORTED = 10
- STATE_SUCCESS = 20
- STATE_BUSY = 25
- STATE_READ_SENDER_INFO = 30
- STATE_PRERENDER = 40
- STATE_COUNT_PAGES = 50
- STATE_NEXT_RECIPIENT = 60
- STATE_COVER_PAGE = 70
- STATE_SINGLE_FILE = 80
- STATE_MERGE_FILES = 90
- STATE_SINGLE_FILE = 100
- STATE_SEND_FAX = 110
- STATE_CLEANUP = 120
- STATE_ERROR = 130
- next_recipient = self.next_recipient_gen()
- state = STATE_READ_SENDER_INFO
- self.rendered_file_list = []
- while state != STATE_DONE:
- if self.check_for_cancel():
- state = STATE_ABORTED
-
- log.debug('STATE=(%d, 0, 0)' % state)
- if state == STATE_ABORTED:
- log.error('Aborted by user.')
- self.write_queue((STATUS_IDLE, 0, ''))
- state = STATE_CLEANUP
- continue
- if state == STATE_SUCCESS:
- log.debug('Success.')
- self.write_queue((STATUS_COMPLETED, 0, ''))
- state = STATE_CLEANUP
- continue
- if state == STATE_ERROR:
- log.error('Error, aborting.')
- self.write_queue((STATUS_ERROR, 0, ''))
- state = STATE_CLEANUP
- continue
- if state == STATE_BUSY:
- log.error('Device busy, aborting.')
- self.write_queue((STATUS_BUSY, 0, ''))
- state = STATE_CLEANUP
- continue
- if state == STATE_READ_SENDER_INFO:
- log.debug('%s State: Get sender info' % '********************')
- state = STATE_PRERENDER
-
- try:
- self.dev.open()
- except Error:
- e = None
- log.error('Unable to open device (%s).' % e.msg)
- state = STATE_ERROR
- else:
-
- try:
- self.sender_name = self.dev.station_name
- log.debug('Sender name=%s' % self.sender_name)
- self.sender_fax = self.dev.phone_num
- log.debug('Sender fax=%s' % self.sender_fax)
- except Error:
- log.error('PML get failed!')
- state = STATE_ERROR
-
- finally:
- self.dev.close()
-
- continue
- if state == STATE_PRERENDER:
- log.debug('%s State: Pre-render non-G3 files' % '********************')
- state = self.pre_render(STATE_COUNT_PAGES)
- continue
- if state == STATE_COUNT_PAGES:
- log.debug('%s State: Get total page count' % '********************')
- state = self.count_pages(STATE_NEXT_RECIPIENT)
- continue
- if state == STATE_NEXT_RECIPIENT:
- log.debug('%s State: Next recipient' % '********************')
- state = STATE_COVER_PAGE
-
- try:
- recipient = next_recipient.next()
- log.debug('Processing for recipient %s' % recipient['name'])
- self.write_queue((STATUS_SENDING_TO_RECIPIENT, 0, recipient['name']))
- except StopIteration:
- state = STATE_SUCCESS
- log.debug('Last recipient.')
- continue
-
- self.recipient_file_list = self.rendered_file_list[:]
- continue
- if state == STATE_COVER_PAGE:
- log.debug('%s State: Render cover page' % '********************')
- state = self.cover_page(recipient)
- continue
- if state == STATE_SINGLE_FILE:
- log.debug('%s State: Handle single file' % '********************')
- state = self.single_file(STATE_SEND_FAX)
- continue
- if state == STATE_MERGE_FILES:
- log.debug('%s State: Merge multiple files' % '********************')
- state = self.merge_files(STATE_SEND_FAX)
- continue
- if state == STATE_SEND_FAX:
- log.debug('%s State: Send fax' % '********************')
- state = STATE_NEXT_RECIPIENT
- FAX_SEND_STATE_DONE = 0
- FAX_SEND_STATE_ABORT = 10
- FAX_SEND_STATE_ERROR = 20
- FAX_SEND_STATE_BUSY = 25
- FAX_SEND_STATE_SUCCESS = 30
- FAX_SEND_STATE_DEVICE_OPEN = 40
- FAX_SEND_STATE_SET_TOKEN = 50
- FAX_SEND_STATE_EARLY_OPEN = 60
- FAX_SEND_STATE_SET_PARAMS = 70
- FAX_SEND_STATE_CHECK_IDLE = 80
- FAX_SEND_STATE_START_REQUEST = 90
- FAX_SEND_STATE_LATE_OPEN = 100
- FAX_SEND_STATE_SEND_DIAL_STRINGS = 110
- FAX_SEND_STATE_SEND_FAX_HEADER = 120
- FAX_SEND_STATE_SEND_PAGES = 130
- FAX_SEND_STATE_SEND_END_OF_STREAM = 140
- FAX_SEND_STATE_WAIT_FOR_COMPLETE = 150
- FAX_SEND_STATE_RESET_TOKEN = 160
- FAX_SEND_STATE_CLOSE_SESSION = 170
- monitor_state = False
- error_state = pml.DN_ERROR_NONE
- fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
- while fax_send_state != FAX_SEND_STATE_DONE:
- if self.check_for_cancel():
- log.error('Fax send aborted.')
- fax_send_state = FAX_SEND_STATE_ABORT
-
- if monitor_state:
- fax_state = self.getFaxDownloadState()
- if fax_state not in (pml.UPDN_STATE_XFERACTIVE, pml.UPDN_STATE_XFERDONE):
- log.error('D/L error state=%d' % fax_state)
- fax_send_state = FAX_SEND_STATE_ERROR
- state = STATE_ERROR
-
-
- log.debug('STATE=(%d, %d, 0)' % (STATE_SEND_FAX, fax_send_state))
- if fax_send_state == FAX_SEND_STATE_ABORT:
- monitor_state = False
- fax_send_state = FAX_SEND_STATE_RESET_TOKEN
- state = STATE_ABORTED
- continue
- if fax_send_state == FAX_SEND_STATE_ERROR:
- log.error('Fax send error.')
- error_state = self.getFaxDownloadError()
- log.debug('Error State=%d (%s)' % (error_state, pml.DN_ERROR_STR.get(error_state, 'Unknown')))
- monitor_state = False
- fax_send_state = FAX_SEND_STATE_RESET_TOKEN
- state = STATE_ERROR
- continue
- if fax_send_state == FAX_SEND_STATE_BUSY:
- log.error('Fax device busy.')
- monitor_state = False
- fax_send_state = FAX_SEND_STATE_RESET_TOKEN
- state = STATE_BUSY
- continue
- if fax_send_state == FAX_SEND_STATE_SUCCESS:
- log.debug('Fax send success.')
- monitor_state = False
- fax_send_state = FAX_SEND_STATE_RESET_TOKEN
- state = STATE_NEXT_RECIPIENT
- continue
- if fax_send_state == FAX_SEND_STATE_DEVICE_OPEN:
- log.debug('%s State: Open device' % '********************')
- fax_send_state = FAX_SEND_STATE_SET_TOKEN
-
- try:
- self.dev.open()
- except Error:
- e = None
- log.error('Unable to open device (%s).' % e.msg)
- fax_send_state = FAX_SEND_STATE_ERROR
-
- if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
- fax_send_state = FAX_SEND_STATE_ERROR
-
- self.dev.device_state == DEVICE_STATE_NOT_FOUND
- if fax_send_state == FAX_SEND_STATE_SET_TOKEN:
- log.debug('%s State: Acquire fax token' % '********************')
-
- try:
- (result_code, token) = self.dev.getPML(pml.OID_FAX_TOKEN)
- except Error:
- log.debug('Unable to acquire fax token (1).')
- fax_send_state = FAX_SEND_STATE_EARLY_OPEN
-
- None if result_code > pml.ERROR_MAX_OK else check_token == token
- if fax_send_state == FAX_SEND_STATE_EARLY_OPEN:
- log.debug('%s State: Early open' % '********************')
- fax_send_state = FAX_SEND_STATE_CHECK_IDLE
- if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
- log.debug('Opening fax channel.')
-
- try:
- self.dev.openFax()
- except Error:
- e = None
- log.error('Unable to open channel (%s).' % e.msg)
- fax_send_state = FAX_SEND_STATE_ERROR
- except:
- None<EXCEPTION MATCH>Error
-
-
- None<EXCEPTION MATCH>Error
- log.debug('Skipped.')
- continue
- if fax_send_state == FAX_SEND_STATE_CHECK_IDLE:
- log.debug('%s State: Check idle' % '********************')
- fax_send_state = FAX_SEND_STATE_START_REQUEST
- dl_state = self.getFaxDownloadState()
- tx_status = self.getFaxJobTxStatus()
- rx_status = self.getFaxJobRxStatus()
- if dl_state == pml.UPDN_STATE_IDLE and dl_state == pml.UPDN_STATE_ERRORABORT or dl_state == pml.UPDN_STATE_XFERDONE:
- if tx_status == pml.FAXJOB_TX_STATUS_IDLE or tx_status == pml.FAXJOB_TX_STATUS_DONE:
- pass
- None if rx_status == pml.FAXJOB_RX_STATUS_IDLE or rx_status == pml.FAXJOB_RX_STATUS_DONE else dl_state == pml.UPDN_STATE_IDLE
- fax_send_state = FAX_SEND_STATE_BUSY
- continue
- if fax_send_state == FAX_SEND_STATE_START_REQUEST:
- log.debug('%s State: Request start' % '********************')
- fax_send_state = FAX_SEND_STATE_SET_PARAMS
- dl_state = self.getFaxDownloadState()
- if dl_state == pml.UPDN_STATE_IDLE:
- log.debug('Try: 0')
- log.debug('Setting to up/down state request start...')
- self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
- time.sleep(1)
- log.debug('Waiting for active state...')
- i = 1
- while i < 10:
- log.debug('Try: %d' % i)
-
- try:
- dl_state = self.getFaxDownloadState()
- except Error:
- log.error('PML/SNMP error')
- fax_send_state = FAX_SEND_STATE_ERROR
- break
-
- if dl_state == pml.UPDN_STATE_XFERACTIVE:
- break
-
- time.sleep(1)
- log.debug('Setting to up/down state request start...')
- self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
- i += 1
- log.error('Could not get into active state!')
- fax_send_state = FAX_SEND_STATE_BUSY
- monitor_state = True
- else:
- log.error('Could not get into idle state!')
- fax_send_state = FAX_SEND_STATE_BUSY
- dl_state == pml.UPDN_STATE_IDLE
- if fax_send_state == FAX_SEND_STATE_SET_PARAMS:
- log.debug('%s State: Set params' % '********************')
- fax_send_state = FAX_SEND_STATE_LATE_OPEN
-
- try:
- self.dev.setPML(pml.OID_DEV_DOWNLOAD_TIMEOUT, pml.DEFAULT_DOWNLOAD_TIMEOUT)
- self.dev.setPML(pml.OID_FAXJOB_TX_TYPE, pml.FAXJOB_TX_TYPE_HOST_ONLY)
- log.debug('Setting date and time on device.')
- self.dev.setDateAndTime()
- except Error:
- e = None
- log.error('PML/SNMP error (%s)' % e.msg)
- fax_send_state = FAX_SEND_STATE_ERROR
- except:
- None<EXCEPTION MATCH>Error
-
-
- None<EXCEPTION MATCH>Error
- if fax_send_state == FAX_SEND_STATE_LATE_OPEN:
- log.debug('%s State: Late open' % '********************')
- fax_send_state = FAX_SEND_STATE_SEND_DIAL_STRINGS
- if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
- log.debug('Opening fax channel.')
-
- try:
- self.dev.openFax()
- except Error:
- log.error('Unable to open channel.')
- fax_send_state = FAX_SEND_STATE_ERROR
- except:
- None<EXCEPTION MATCH>Error
-
-
- None<EXCEPTION MATCH>Error
- log.debug('Skipped.')
- continue
- if fax_send_state == FAX_SEND_STATE_SEND_DIAL_STRINGS:
- log.debug('%s State: Send dial strings' % '********************')
- fax_send_state = FAX_SEND_STATE_SEND_FAX_HEADER
- log.debug('Dialing: %s' % recipient['fax'])
- log.debug('Sending dial strings...')
- self.create_mfpdtf_fixed_header(DT_DIAL_STRINGS, True, PAGE_FLAG_NEW_DOC | PAGE_FLAG_END_DOC | PAGE_FLAG_END_STREAM)
- dial_strings = recipient['fax'].encode('ascii')
- log.debug(repr(dial_strings))
- self.create_mfpdtf_dial_strings(dial_strings)
-
- try:
- self.write_stream()
- except Error:
- log.error('Channel write error.')
- fax_send_state = FAX_SEND_STATE_ERROR
- except:
- None<EXCEPTION MATCH>Error
-
-
- None<EXCEPTION MATCH>Error
- if fax_send_state == FAX_SEND_STATE_SEND_FAX_HEADER:
- log.debug('%s State: Send fax header' % '********************')
- fax_send_state = FAX_SEND_STATE_SEND_PAGES
-
- try:
- ff = file(self.f, 'r')
- except IOError:
- log.error('Unable to read fax file.')
- fax_send_state = FAX_SEND_STATE_ERROR
- continue
-
-
- try:
- header = ff.read(FILE_HEADER_SIZE)
- except IOError:
- log.error('Unable to read fax file.')
- fax_send_state = FAX_SEND_STATE_ERROR
- continue
-
- (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = self.decode_fax_header(header)
- None if magic != 'hplip_g3' else None<EXCEPTION MATCH>Error
- if fax_send_state == FAX_SEND_STATE_SEND_PAGES:
- log.debug('%s State: Send pages' % '********************')
- fax_send_state = FAX_SEND_STATE_SEND_END_OF_STREAM
- page = StringIO()
- for p in range(total_pages):
- if self.check_for_cancel():
- fax_send_state = FAX_SEND_STATE_ABORT
-
- if fax_send_state == FAX_SEND_STATE_ABORT:
- break
-
-
- try:
- header = ff.read(PAGE_HEADER_SIZE)
- except IOError:
- log.error('Unable to read fax file.')
- fax_send_state = FAX_SEND_STATE_ERROR
- continue
-
- (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2) = self.decode_page_header(header)
- log.debug('Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d' % (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
- page.write(ff.read(bytes_to_read))
- thumbnail = ff.read(thumbnail_bytes)
- page.seek(0)
- self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags = PAGE_FLAG_NEW_PAGE)
- self.create_sop_record(page_num, hort_dpi, vert_dpi, ppr, rpp, encoding)
-
- try:
- data = page.read(RASTER_DATA_SIZE)
- except IOError:
- log.error('Unable to read fax file.')
- fax_send_state = FAX_SEND_STATE_ERROR
- continue
-
- if data == '':
- log.error('No data!')
- fax_send_state = FAX_SEND_STATE_ERROR
- continue
-
- self.create_raster_data_record(data)
- total_read = RASTER_DATA_SIZE
- while True:
- data = page.read(RASTER_DATA_SIZE)
- total_read += RASTER_DATA_SIZE
- self.getFaxDownloadState()
- if data == '':
- self.create_eop_record(rpp)
-
- try:
- self.write_stream()
- except Error:
- log.error('Channel write error.')
- fax_send_state = FAX_SEND_STATE_ERROR
-
- break
- else:
-
- try:
- self.write_stream()
- except Error:
- log.error('Channel write error.')
- fax_send_state = FAX_SEND_STATE_ERROR
- break
-
- status = self.getFaxJobTxStatus()
- while status == pml.FAXJOB_TX_STATUS_DIALING:
- self.write_queue((STATUS_DIALING, 0, recipient['fax']))
- time.sleep(1)
- if self.check_for_cancel():
- fax_send_state = FAX_SEND_STATE_ABORT
- break
-
- dl_state = self.getFaxDownloadState()
- if dl_state == pml.UPDN_STATE_ERRORABORT:
- fax_send_state = FAX_SEND_STATE_ERROR
- break
-
- status = self.getFaxJobTxStatus()
- if fax_send_state not in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
- while status == pml.FAXJOB_TX_STATUS_CONNECTING:
- self.write_queue((STATUS_CONNECTING, 0, recipient['fax']))
- time.sleep(1)
- if self.check_for_cancel():
- fax_send_state = FAX_SEND_STATE_ABORT
- break
-
- dl_state = self.getFaxDownloadState()
- if dl_state == pml.UPDN_STATE_ERRORABORT:
- fax_send_state = FAX_SEND_STATE_ERROR
- break
-
- status = self.getFaxJobTxStatus()
-
- if status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
- self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
-
- self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags = 0)
- self.create_raster_data_record(data)
- if fax_send_state in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
- break
- continue
- page.truncate(0)
- page.seek(0)
-
- if fax_send_state == FAX_SEND_STATE_SEND_END_OF_STREAM:
- log.debug('%s State: Send EOS' % '********************')
- fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
- log.debug('End of stream...')
- self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, False, PAGE_FLAG_END_STREAM)
-
- try:
- self.write_stream()
- except Error:
- log.error('Channel write error.')
- fax_send_state = FAX_SEND_STATE_ERROR
-
- monitor_state = False
- continue
- if fax_send_state == FAX_SEND_STATE_WAIT_FOR_COMPLETE:
- log.debug('%s State: Wait for completion' % '********************')
- fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
- time.sleep(1)
- status = self.getFaxJobTxStatus()
- if status == pml.FAXJOB_TX_STATUS_DIALING:
- self.write_queue((STATUS_DIALING, 0, recipient['fax']))
- log.debug('Dialing ...')
- elif status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
- self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
- log.debug('Transmitting ...')
- elif status in (pml.FAXJOB_TX_STATUS_DONE, pml.FAXJOB_RX_STATUS_IDLE):
- fax_send_state = FAX_SEND_STATE_RESET_TOKEN
- state = STATE_NEXT_RECIPIENT
- log.debug('Transmitting done or idle ...')
- else:
- self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
- log.debug('Pending ...')
- status == pml.FAXJOB_TX_STATUS_DIALING
- if fax_send_state == FAX_SEND_STATE_RESET_TOKEN:
- self.write_queue((STATUS_CLEANUP, 0, ''))
- log.debug('%s State: Release fax token' % '********************')
-
- try:
- self.dev.setPML(pml.OID_FAX_TOKEN, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
- except Error:
- log.error('Unable to release fax token.')
-
- fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
- continue
- if fax_send_state == FAX_SEND_STATE_CLOSE_SESSION:
- log.debug('%s State: Close session' % '********************')
- fax_send_state = FAX_SEND_STATE_DONE
- log.debug('Closing session...')
-
- try:
- mm.close()
- except NameError:
- pass
-
-
- try:
- ff.close()
- except NameError:
- pass
-
- if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
- log.debug('Closing fax channel.')
- self.dev.closeFax()
-
- self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_IDLE)
- time.sleep(1)
- if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
- log.debug('Closing fax channel.')
- self.dev.closeFax()
-
- self.dev.close()
- continue
- continue
- if state == STATE_CLEANUP:
- log.debug('%s State: Cleanup' % '********************')
- if self.remove_temp_file:
- log.debug('Removing merged file: %s' % self.f)
-
- try:
- os.remove(self.f)
- log.debug('Removed')
- except OSError:
- log.debug('Not found')
- except:
- None<EXCEPTION MATCH>OSError
-
-
- None<EXCEPTION MATCH>OSError
- state = STATE_DONE
- continue
-
-
- def getFaxDownloadState(self):
- (result_code, state) = self.dev.getPML(pml.OID_FAX_DOWNLOAD)
- if state:
- log.debug('D/L State=%d (%s)' % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
- return state
- return pml.UPDN_STATE_ERRORABORT
-
-
- def getFaxDownloadError(self):
- (result_code, state) = self.dev.getPML(pml.OID_FAX_DOWNLOAD_ERROR)
- if state:
- return state
- return pml.DN_ERROR_UNKNOWN
-
-
- def getFaxJobTxStatus(self):
- (result_code, status) = self.dev.getPML(pml.OID_FAXJOB_TX_STATUS)
- if status:
- log.debug('Tx Status=%d (%s)' % (status, pml.FAXJOB_TX_STATUS_STR.get(status, 'Unknown')))
- return status
- return pml.FAXJOB_TX_STATUS_IDLE
-
-
- def getFaxJobRxStatus(self):
- (result_code, status) = self.dev.getPML(pml.OID_FAXJOB_RX_STATUS)
- if status:
- log.debug('Rx Status=%d (%s)' % (status, pml.FAXJOB_RX_STATUS_STR.get(status, 'Unknown')))
- return status
- return pml.FAXJOB_RX_STATUS_IDLE
-
-
- def getCfgUploadState(self):
- (result_code, state) = self.dev.getPML(pml.OID_DEVICE_CFG_UPLOAD)
- if state:
- log.debug('Cfg Upload State = %d (%s)' % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
- return state
- return pml.UPDN_STATE_ERRORABORT
-
-
- def create_mfpdtf_fixed_header(self, data_type, send_variant = False, page_flags = 0):
- header_len = FIXED_HEADER_SIZE
- if send_variant:
- if data_type == DT_DIAL_STRINGS:
- header_len += DIAL_STRINGS_VARIANT_HEADER_SIZE
- elif data_type == DT_FAX_IMAGES:
- header_len += FAX_IMAGE_VARIANT_HEADER_SIZE
-
-
- self.stream.write(struct.pack('<IHBB', 0, header_len, data_type, page_flags))
-
-
- def create_mfpdtf_dial_strings(self, number):
- p = struct.pack('<BBHH51s', MAJOR_VER, MINOR_VER, 1, 51, number[:51])
- log.debug(repr(p))
- self.stream.write(p)
-
-
- def adjust_fixed_header_block_size(self):
- size = self.stream.tell()
- self.stream.seek(0)
- self.stream.write(struct.pack('<I', size))
-
-
- def create_sop_record(self, page_num, hort_dpi, vert_dpi, ppr, rpp, encoding, bpp = 1):
- self.stream.write(struct.pack('<BBHHHIHHHHHHIHHHH', RT_START_PAGE, encoding, page_num, ppr, bpp, rpp, 0, hort_dpi, 0, vert_dpi, ppr, bpp, rpp, 0, hort_dpi, 0, vert_dpi))
-
-
- def create_eop_record(self, rpp):
- self.stream.write(struct.pack('<BBBBII', RT_END_PAGE, 0, 0, 0, rpp, 0))
-
-
- def create_raster_data_record(self, data):
- if not len(data) <= RASTER_DATA_SIZE:
- raise AssertionError
- self.stream.write(struct.pack('<BBH', RT_RASTER, 0, len(data)))
- self.stream.write(data)
-
-
- def create_mfpdtf_fax_header(self, total_pages):
- self.stream.write(struct.pack('<BBBHBI20s20s20sI', MAJOR_VER, MINOR_VER, SRC_HOST, total_pages, TTI_PREPENDED_TO_IMAGE, 0, '', '', '', 0))
-
-
- def write_stream(self):
- self.adjust_fixed_header_block_size()
- self.dev.writeFax(self.stream.getvalue())
- self.stream.truncate(0)
- self.stream.seek(0)
-
-
-